Java Spring: Как преобразовать коды символов HTML в шестнадцатеричном формате из текста в обычный текст? - PullRequest
0 голосов
/ 31 мая 2019

У меня есть веб-приложение, написанное при загрузке React JS и Java Spring. В моем компоненте платы есть форма с текстовой областью и кнопкой. При отладке, когда я нажимаю на кнопку, я перенаправляю на PostMapping в весеннем проекте UserController. Мой метод имеет один параметр. Это запрос @RequestBody String. Я получаю текст из textarea в кодировках символов HTML в шестнадцатеричном коде. Мне нужно набрать текст из этой строки.

Я получаю что-то похожее на это:

CREATE + СТОЛ + пользователи +% 28% 0A% 09id + INT% 2C% 0A% 09fullName + VARCHAR% 28220% 29 + НЕ + NULL% 2C% 0A% 09city + VARCHAR% 28120% 29 + НЕ + NULL% 2C % 0A% 09country + VARCHAR% 2860% 29 + NOT + NULL% 2C% 0A% 09PRIMARY + KEY% 28id% 29% 0A% 29% 3 ...

где + означает пробел

Я пытался решить эту проблему. Ничего не работает.

Первый способ:

byte[] s = DatatypeConverter.parseHexBinary(query);
System.out.println(new String(s, "UTF-8"));

Второй способ: Кодек Apache Commons - Hex

byte[] bytes = Hex.decodeHex(query.toCharArray());
System.out.println(new String(bytes, "UTF-8"));

Вот мой код

Весенний проект:

Класс UserController

@Controller
@RequestMapping("fiddle")
public class MainController {

@PostMapping
public ResponseEntity<?> processingQueries(@RequestBody String query) {
    System.out.println(query);

    return new ResponseEntity<String>("Query prcessed successfully.", HttpStatus.OK);
}

}

Проект React JS:

Плата компонента

import React from 'react';
import TableButton from './TableButton';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import { processQueries } from '../actions/queryActions';

class Board extends React.Component {
constructor() {
    super();

    this.state = {
        query: 'Write here your SQL query...'
    }
    this.onChange = this.onChange.bind(this);
    this.resetField = this.resetField.bind(this);
    this.onSubmitRun = this.onSubmitRun.bind(this);
}

onChange(e) {
    this.setState({ [e.target.name]: e.target.value });
}

resetField(e) {
    this.setState({ query: '' });
}

onSubmitRun(e) {
    e.preventDefault();
    console.log(this.state.query);
    this.props.processQueries(this.state.query, this.props.history);
}

render() {
    return (
        <div className="box flex-stretch">
            <div className="blue smallClass">
                <TableButton />
            </div>
            <div className="mediumClass">
                <form onSubmit={this.onSubmitRun}>
                    <textarea 
                        name="query" 
                        className="txtArea"
                        value={this.state.query}
                        onChange={this.onChange}
                        onClick={this.resetField}
                        rows="27"
                    >
                        Write here your SQL queries...
                    </textarea>
                    <input type="submit" value="Run" className="runButton"/>
                </form>
            </div>
            <div className="red largeClass">
                One of three columns
            </div>
        </div>
    );
}
}

Board.propTypes = {
query: PropTypes.string
}

const mapStateToProps = state => ({
query: state.query
})

export default connect(mapStateToProps, { processQueries })(Board);

queryReducer

import { PROCESS_QUERY } from '../actions/types';

const initialState = {
query: ''
}

export default function(state = initialState, action) {
switch(action.type) {
    case PROCESS_QUERY:
        return {
            ...state,
            query: action.payload
        }
    default:
        return state;
}
}

queryActions

import axios from 'axios';
import { GET_ERRORS, PROCESS_QUERY } from './types';

export const processQueries = (query, history) => async dispatch => 
{
try {
    console.log(query);
    await axios.post("/fiddle", query);
    history.push("/fiddle");

    dispatch({
        type: PROCESS_QUERY,
        payload: ''
    })
} catch(error) {
    dispatch({
        type: GET_ERRORS,
        payload: error.response.data
    })
}
}

Мне нужно преобразовать эту строку из текста в обычный текст. Данные, вставленные в textarea, являются плановыми SQL-запросами.

1 Ответ

0 голосов
/ 01 июня 2019

Все, что вам нужно для декодирования строки: UrlDecoder.

String result = java.net.URLDecoder.decode(query, StandardCharsets.UTF_8.displayName());
...