0

私はプロジェクトを開発していますが、php curl を使用して、Java の安らかな Web サービスにデータを投稿する方法についていくつかの困難があります。

SQL:

DROP DATABASE IF EXISTS POST_TESTE;
CREATE DATABASE POST_TESTE;
USE POST_TESTE;

CREATE TABLE GRAU  (
ID_GRAU             TINYINT         UNSIGNED        NOT NULL,
DESCRICAO_GRAU      VARCHAR(20)     NOT NULL
);

ALTER TABLE GRAU ADD CONSTRAINT PK_GRAU PRIMARY KEY (ID_GRAU);
ALTER TABLE GRAU CHANGE ID_GRAU ID_GRAU TINYINT UNSIGNED NOT NULL AUTO_INCREMENT;

INSERT INTO GRAU (DESCRICAO_GRAU) VALUES ('CET');
INSERT INTO GRAU (DESCRICAO_GRAU) VALUES ('Licenciatura');
INSERT INTO GRAU (DESCRICAO_GRAU) VALUES ('Pós-Licenciatura');
INSERT INTO GRAU (DESCRICAO_GRAU) VALUES ('Pós-Graduação');
INSERT INTO GRAU (DESCRICAO_GRAU) VALUES ('Mestrado');
INSERT INTO GRAU (DESCRICAO_GRAU) VALUES ('Doutoramento');

Netbeans では、「Teste」という Web アプリケーションを作成し、データベースから安静な Web サービスを作成しました。ここで、上で作成したテーブルを選択しました。テーブル vars に関連するクラスがある 1 つ目 (エンティティ) と、提供されるサービスに関連する 2 つ目 (サービス) の 2 つのパッケージを作成しました。

したがって、消費するサービスの URL は http:// localhost:8080/Teste/resources/entity.grau です。

Grau.java :

@Entity
@Table(name = "grau")
@XmlRootElement
@XmlType(propOrder={"idGrau", "descricaoGrau"})
@NamedQueries({
    @NamedQuery(name = "Grau.findAll", query = "SELECT g FROM Grau g"),
    @NamedQuery(name = "Grau.findByIdGrau", query = "SELECT g FROM Grau g WHERE g.idGrau = :idGrau"),
    @NamedQuery(name = "Grau.findByDescricaoGrau", query = "SELECT g FROM Grau g WHERE g.descricaoGrau = :descricaoGrau")})
public class Grau implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @NotNull
    @Column(name = "ID_GRAU")
    private Short idGrau;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 20)
    @Column(name = "DESCRICAO_GRAU")
    private String descricaoGrau;

GrauFacadeREST.java :

@Stateless
@Path("entity.grau")
public class GrauFacadeREST extends AbstractFacade<Grau> {

@PersistenceContext(unitName = "TestePU")
private EntityManager em;

public GrauFacadeREST() {
    super(Grau.class);
}

@POST
@Override
@Consumes({"application/xml", "application/json"})
public void create(Grau entity) {
    super.create(entity);
}

@PUT
@Override
@Consumes({"application/xml", "application/json"})
public void edit(Grau entity) {
    super.edit(entity);
}

GET、DELETE サービスなど、さらに多くのサービスが開発されていますが、この 2 つだけを理解したいと思います。

私は、データを .php に投稿する 1 つの入力テキストを含む基本的な html を開発しまし

teste.html :

<html><body>
<form action="teste.php" method="post">
        <input type="text" name="text1" /></br>
    <input type="submit" value="Submeter" />
</form>
</body></html>

teste.php :

<?php

$var=$_POST['text1'];

$xml = new SimpleXMLElement('<graus/>');
$teste = $xml->addChild('grau');
$teste -> addChild('idGrau', '7');
$teste -> addChild('descricaoGrau', $var);
$teste1 = $xml->addChild('grau');
$teste1 -> addChild('idGrau', '8');
$teste1 -> addChild('descricaoGrau', $var);

//$xml="<graus><grau><idgrau>7</idgrau><descricaograu>asdf</descricaograu></grau><grau><idgrau>8</idgrau><descricaograu>asdf</descricaograu></grau></graus>";

/* $xml = array(
        "idgrau" => '7',
        "descricaograu" => $var,
);
*/

print($xml->asXML());

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://localhost:8080/Teste/resources/entity.grau/');
//curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/xml'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$data=curl_exec($ch); 

if (curl_errno($ch)){
    echo curl_error($ch);
    exit;
}   
var_dump($data);
curl_close($ch);

?>

送信ポストフィールドを変更したり、ポストフィールドに配列を挿入したりなど、さまざまな方法でこれを試しましたが、それでも同じエラーが発生します。

HTTP ステータス 400 - 不正な要求 クライアントから送信された要求は構文的に正しくありません (Bad Request)。

これは、ユーザーが findAll() メソッドを使用したときに開発された .php によるレスポンシブ xml です。

<graus>
    <grau>
        <idGrau>1</idGrau>
        <descricaoGrau>CET</descricaoGrau>
    </grau>
    <grau>
        <idGrau>2</idGrau>
        <descricaoGrau>Licenciatura</descricaoGrau>
    </grau>
    <grau>
        <idGrau>3</idGrau>
        <descricaoGrau>Pós-Licenciatura</descricaoGrau>
    </grau>
    <grau>
        <idGrau>4</idGrau>
        <descricaoGrau>Pós-Graduação</descricaoGrau>
    </grau>
    <grau>
        <idGrau>5</idGrau>
        <descricaoGrau>Mestrado</descricaoGrau>
    </grau>
    <grau>
        <idGrau>6</idGrau>
        <descricaoGrau>Doutoramento</descricaoGrau>
    </grau>
</graus>

誰かが助けてくれたら、私は感謝します.

4

0 に答える 0